
#ifndef FORM_QST_H
#define FORM_QST_H

#include "info.h"

namespace Ui {
class Form_qst;
}

class Form_qst : public QWidget {
    Q_OBJECT

    //=============================================================================PUBLIC
public:
    explicit Form_qst(QWidget *parent = nullptr);
    ~Form_qst();

    //! 用户信息
    loginInfo           lginfo;                         //!< 登录的用户信息
    setting             set;                            //!< 设置信息

    //! 接口
    void    setUserMsg(setting* s,loginInfo* inf);                  //!< 传递用户信息
    void    setupEditor();                                          //!< 设置编辑器环境
    void    setupAnswer();                                          //!< 设置做题器环境
    void    newQEditor();                                           //!< 新建 + 编辑
    void    openQDlg(bool mode);                                    //!< 打开 + 对话框 + 模式设置
    void    openQPath(QString mpath,bool mode);                     //!< 按路径打开 + 模式设置

    QString rec_fname();                                            //!< 记录/报告文件名(不含后缀)
    QString report_ans();                                           //!< 写报告
    QString record_ans();                                           //!< 写记录(.csv)
    //========================参数

    int     nopro = 0;                      //!< 题目ID
    int     noqst = 0;                      //!< 最新题号
    int     timeleft = 0;                   //!< 剩余时间s

    bool    isTicked = 0;                   //!< 是否计时
    bool    isEditor = 0;                   //!< 是不是编辑器
    bool    isChanged = 0;                  //!< 文件是否发生改变
    double  totalscore = 0;                 //!< 题目总分

    QTime   whenStart;                      //!< 开始做题时间
    QTime   timeLimit;                      //!< 时间限制
    QString problem_title;                  //!< 题目标题
    QString path;                           //!< 题目文件路径
    QList<QList<QString>> lst_ans;          //!< 正确答案


    //! 作答情况：
    double  score_ans;                      //!< 回答得分
    int     numqst_ans;                     //!< 总题目数
    int     numAC_ans;                      //!< 做对了多少题
    int     numWA_ans;                      //!< 做错了多少题
    int     numTLE_ans;                     //!< 没做多少题
    int     numNRated_ans;                  //!< 没改多少题
    int     timeSecUsed;                    //!< 用时多久

    QList<QString> lst_nAC;                 //!< 不正确信息
    QList<QString> lst_allans;              //!< 回答的答案
private slots:  //槽

    //======================================================================================================动态控件
    void onclick_but_append();              //!< 点击：编辑树控件 -- 添加
    void onclick_TreeCtrlDel();             //!< 点击：编辑树控件 -- 删除
    void onchange_TreeCtrlText();           //!< 更改：编辑树控件 -- 题干文本框
    void onchange_TreeCtrlCombo();          //!< 更改：编辑树控件 -- 组合框
    void onchange_TreeCtrlSmallNo();        //!< 更改：编辑树控件 -- 小题号
    void onchange_TreeCtrlTitle();          //!< 更改：编辑树控件 -- 标题
    void onchange_TreeCtrlTimeEdit();       //!< 更改：编辑树控件 -- 限时
    void timeout_Timer_ans();               //!< 计时器事件：限时

    //======================================================================================================静态控件
    void on_but_back_clicked();             //!< 点击：编辑器 -- 返回

    void on_but_preview_clicked();          //!< 点击：编辑器 -- 视图切换

    void on_but_new_clicked();              //!< 点击：编辑器 -- 新建

    void on_but_cin_clicked();              //!< 点击：编辑器 -- 做题视角

    void on_but_save_clicked();             //!< 点击：编辑器 -- 保存

    void on_text_material_textChanged();    //!< 更改：源码区文本

    void on_pushButton_clicked();           //!< 点击：编辑器 -- 清空

    void on_but_calc_clicked();             //!< 点击：做题器 -- 提交/算分

    void on_but_open_clicked();             //!< 点击：编辑器 -- 打开

    void on_but_next_clicked();             //!< 点击：做题器 -- 下一个

    void on_but_help_clicked();             //!< 点击：编辑器 -- 帮助

    void on_but_help_triggered(QAction *arg1);  //!< 暂不用
    void on_but_setscore_clicked();

signals:    //!< 信号

    void send_save_grd(QString &htmlf,QString &csvf);               //!< 当作答记录产生 传递html csv文件路径 供其它窗体使用
    void qsted_closed();                                            //!< 当窗体关闭时产生


private:
    Ui::Form_qst *ui;
    void    drawMe();

    void    addMainqst_ed();                //!< 编辑器 -- 加一组题目主信息编辑栏
    void    addqst_ed();                    //!< 编辑器 -- 添加一组小题目编辑
    void    linktext_ed(int i);             //!< 弃用
    void    newqst_ed();                    //!< 编辑器 -- 新建题目
    int     checkqst_ed();                  //!< 编辑器 -- 检查题目
    void    saveqst_ed();                   //!< 编辑器 -- 保存题目
    void    openqst_ed();                   //!< 编辑器 -- 打开题目
    void    showqsthmp_ans(bool);           //!< 编辑器 -- 将编辑器中内容转化成排版视图 设置是否显示答案
    void    htmlToTree_ed();                //!< 编辑器 -- 将HTML源码转化成编辑器中内容

    void    openqst_ans(QString mpath);     //!< 做题器 -- 按路径打开题目
    void    readqst_ans();                  //!< 弃用
    void    addqst_ans();                   //!< 做题器 -- 提取HTML源码信息 得到做题栏
    void    showqst_ans();                  //!< 弃用
    void    able_ans(bool);                 //!< 做题器 -- 作答控件能否操作

    int     match_ans(QString category,QString stdansText,QString myansText); //!< 做题器 -- 答案比对标准
    void    calcscore_ans();                //!< 做题器 -- 计算出作答的信息 保存在本窗体属性中
    void    save_grd();                     //!< 做题器 -- 保存作答的报告和记录 在records文件夹下

    void    startTick_ans();                //!< 做题器 -- 开始计时
    void    stopTick_ans();                 //!< 做题器 -- 停止计时
    void    timeout_ans();                  //!< 做题器 -- 时间到！

    void    clearAll();                     //!< 清空全部数据

    //HTML处理
    QString htmlheader_ans();               //!< 题目文件头部源码格式
    QString htmlfmth1_ans();                //!< 标题源码格式
    QString htmlfmtMain_ans();              //!< 题干源码格式
    QString htmlfmtqst_ans();               //!< 小题源码格式
    QString htmlTab();                      //!< tab
    QString htmlfmtans_ans();               //!< 答案源码格式
    QString htmlfmthide_ans();              //!< 隐藏块源码格式
    QString htmlsplitQA();                  //!< 分隔符
    QString turnTohtml();                   //!< 将编辑器中内容转化成HTML源码



    //指定动态控件
    QPushButton*    but_append = 0;
    QTextEdit*      text_Mainqst = 0;
    QTimer*         timer_ans = 0;
protected:
    void closeEvent(QCloseEvent* event);                //!< 窗体关闭
    bool eventFilter(QObject *obj,QEvent * event);      //!< 窗体消息拦截
    void keyPressEvent(QKeyEvent* e);                   //!< 按键信息
    void showEvent(QShowEvent* e);                      //!< 显示
};

#endif // FORM_QST_H
